package response

import (
	"net/http"
	"os"
	"server/global"

	"github.com/gin-gonic/gin"
)

// 响应结构体
type Response struct {
	ErrorCode int         `json:"error_code"` //自定义错误码
	Data      interface{} `json:"data"`       //数据
	Message   string      `json:"message"`    //信息
}

// Success 响应成功 ErrorCode 为0表示成功
func Success(ctx *gin.Context, data interface{}) {
	ctx.JSON(http.StatusOK, Response{
		0,
		data,
		"ok",
	})
}

// Fail响应失败ErrorCode 不为 0表示失败
func Fail(ctx *gin.Context, errorCode int, msg string) {
	ctx.JSON(http.StatusOK, Response{
		errorCode,
		nil,
		msg,
	})
}

// FailByError失败响应 返回自定义错误的错误码、错误信息
func FailByError(ctx *gin.Context, error global.CustomError) {
	Fail(ctx, error.ErrorCode, error.ErrorMsg)
}

// ValidatorFail请求参数验证失败
func ValidateFail(ctx *gin.Context, msg string) {
	Fail(ctx, global.Errors.ValidateError.ErrorCode, msg)
}

// BusinessFail
func BusinessFail(ctx *gin.Context, msg string) {
	Fail(ctx, global.Errors.BusinessError.ErrorCode, msg)
}

// TokenFail,token验证失败
func TokenFail(ctx *gin.Context) {
	FailByError(ctx, global.Errors.TokenError)
}

func ServerError(ctx *gin.Context, err interface{}) {
	msg := "Internal Server Error"
	//非生产环境显示具体错误信息
	if global.App.Config.App.Env != "production" && os.Getenv(gin.EnvGinMode) != gin.ReleaseMode {
		if _, ok := err.(error); ok {
			msg = err.(error).Error()
		}
	}
	ctx.JSON(http.StatusInternalServerError, Response{
		http.StatusInternalServerError,
		nil,
		msg,
	})
	ctx.Abort()
}
